6.1.1 基本函数设置
我们先来看一下 paint 中基本设置的函数都有哪些。
1. setStrokeCap(Paint.Cap cap)
设置线帽样式,取值有 Cap.ROUND (圆形线帽)、Cap.SQUARE (方形线帽)、Paint.Cap.BUTT (无线帽)
红线左侧多出来的区域就是线帽。
|
|
2. setStrokeJoin(Paint.Join join)
参数取值有:Join.MITER (结合处为锐角)、Join.Round (结合处为圆弧)、Join.BEVEL(结合处为直线)
示例:
|
|
3. setPathEffect(PathEffect effect)
设置路径样式。取值类型是所有派生自 PathEffect 的子类:ComposePathEffect、CornerPathEffect、DashPathEffect、DiscretePathEffect、PathDashPathEffect、SumPathEffect。
1)CornerPathEffect
它的作用就是将原来 Path 生硬的直线拐角,变成圆形拐角。
参数 radius:即当前连接两条直线所使用的圆的半径。
示例:
|
|
2)DashPathEffect 虚线效果
phase:开始绘制的偏移值。
intervals[]:表示组成虚线的各个线段的长度;整条虚线就是由 intervals[] 中这些基本线段循环组成的。比如,我们定义 new float[] {20,10};那这个虚线段就是由两段线段组成的,第一个可见的线段长为 20,每二个线段不可见,长度为 10。
对于 intervals[] 数组的有两个限定:
- 长度必须大于等于 2;因为必须有一个实线段和一个空线段来组成虚线。
- 个数必须为偶数,如果是基数,最后一个数字将被忽略;这个很好理解,因为一组虚线的组成必然是一个实线和一个空线成对组成的。
示例:
|
|
3)DiscretePathEffect 离散路径效果
DiscretePathEffect 就是将原来路径分隔成定长的线段,然后将每条线段随机偏移一段位置,我们可以用它来模拟一种类似生锈铁丝的效果。
- 参数 segmentLength:表示将原来的路径切成多长的线段。如果值为 2,那么这个路径就会被切成一段段由长度为 2 的小线段。所以这个值越小,所切成的小线段越多;这个值越大,所切成的小线段越少。
- 参数 deviation:表示被切成的每个小线段的可偏移距离。值越大,就表示每个线段的可偏移距离就越大,就显得越凌乱,值越小,每个线段的可偏移原位置的距离就越小。
示例:
|
|
4)PathDashPathEffect 印章路径效果
它的作用就是用另一个路径图案做为印章,沿着指定路径一个个盖上去。
- Path shape:表示印章路径,比如我们下面示例中的三角形加右上角一个点。
- float advance:表示两个印章路径间的距离,印章间距离越大,间距就越大。
- float phase:路径绘制偏移距离,与上面 DashPathEffect 中的 float phase 参数意义相同。
- Style style:表示在遇到转角时,如何操作印章以使转角平滑过渡,取值有:Style.ROTATE,Style.MORPH,Style.TRANSLATE;Style.ROTATE 表示通过旋转印章来过渡转角;Style.MORPH 表示通过变形印章来过渡转角;Style.TRANSLATE 表示通过位移来过渡转角。
示例:
|
|
5)ComposePathEffect & SumPathEffect
这两个都是用来合并两个特效的。但它们之间是有区别的:
ComposePathEffect 合并两个特效是有先后顺序的,它会先将第二个参数的 PathEffect innerpe 的特效作用于路径上,然后再在此加了特效的路径上作用第一个特效。
而 SumPathEffect 是分别对原始路径分别作用第一个特效和第二个特效。然后再将这两条路径合并,做为最终结果。示例:
|
|
6.1.2 字体相关函数
setTextSize(float textSize)
设置文字大小
setFakeBoldText(boolean fakeBoldText)
设置是否为粗体文字
setStrikeThruText(boolean strikeThruText)
设置带有删除线效果
setUnderlineText(boolean underlineText)
设置下划线
setTextAlign(Paint.Align align)
设置开始绘图点位置
setTextScaleX(float scaleX)
水平拉伸设置
setTextSkewX(float skewX)
设置字体水平倾斜度,普通斜体字是-0.25,可见往右斜
setTypeface(Typeface typeface)
字体样式
setLinearText(boolean linearText)
设置是否打开线性文本标识;由于文本想要快速绘制出来,必然是需要提前缓存在显存中的,一般而言每个文字需要一个字节的大小来存储它(当然具体需要多少字节与编码方式有关),那如果是长篇文章,可见所需的大小可想而知。我们可以通过 setLinearText (true) 告诉 Android 我们不需要这样的文本缓存。但如果我们不用文本缓存,虽然能够省去一些内存空间,但这是以显示速度为代价的。
由于这个是 API 1 的函数,由于当时的 android 手机的内存大小还是很小的,所以尽量减少内存使用是每个应用的头等大事,在当时的的环境下这个函数还是很有用的。
但在今天,内存动不动就是 4G 以上了,文本缓存的所占的那点内存就微不足道了,没有哪个 APP 会牺牲性能来减少这点这内存占用了,所以这个函数基本没用了。
setSubpixelText(boolean subpixelText)
表示是否打开亚像素设置来绘制文本。亚像素的概念比较难理解,首先,我们都知道像素,比如一个 android 手机的分辨率是 1280720,那就是指它的屏幕在垂直方向有 1280 个像素点,水平方向上有 720 个像素点。我们知道每个像素点都是一个独立显示一个颜色的个体。所以如果一副图片,在一个屏幕上用了 300100 个相素点,而在另一个屏幕上却用了 450*150 个像素来显示。那么,请问在哪个屏幕上这张图片显示的更清晰?当然是第二个屏幕,因为它使用的像素点更多,所显示的细节更精细。
那么问题来了,android 设置在出厂时,设定的像素显示都是固定的几个范围:320*480,480*800,720*1280,1080*1920 等等;那么如何在同样的分辨率的显示器中增强显示清晰度呢?
亚像素的概念就油然而生了,亚像素就是把两个相邻的两个像素之间的距离再细分,再插入一些像素,这些通过程序加入的像素就是亚像素。在两个像素间插入的像素个数是通过程序计算出来的,一般是插入两个、三个或四个。
所以打开亚像素显示,是可以在增强文本显示清晰度的,但由于插入亚像素是通过程序计算而来的,所以会耗费一定的计算机性能。注意:亚像素是通过程序计算出来模拟插入的,在没有改变硬件构造的情况下,来改善屏幕分辨率大小。
亚像素显示,是仅在液晶显示器上使用的一种增强字体清晰度的技术。但这种技术有时会出现问题,用投影仪投射到白色墙壁上,会出出字体显示不正常的情况,而且对于老式的 CRT 显示器是根本不支持的。